<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="rn28V" id="rn28V"><span data-lake-id="u07432968" id="u07432968">典型回答</span></h1>
  <p data-lake-id="ue9a0aac0" id="ue9a0aac0"><br></p>
  <p data-lake-id="u266af4aa" id="u266af4aa"><strong><span data-lake-id="ua33042b4" id="ua33042b4">延迟加载允许在需要时按需加载关联对象，而不是在查询主对象时立即加载所有关联对象。这样做可以提高查询性能和减少不必要的数据库访问。</span></strong></p>
  <p data-lake-id="u7b51ac9c" id="u7b51ac9c"><span data-lake-id="u76eb1d05" id="u76eb1d05">​</span><br></p>
  <p data-lake-id="u2958afb9" id="u2958afb9"><span data-lake-id="udf51e7e8" id="udf51e7e8">假设，我们有两张表，分别是订单表和商品项表，一个订单中可以关联多个商品项。</span></p>
  <p data-lake-id="uc71bfe49" id="uc71bfe49"><span data-lake-id="u3fb3f91f" id="u3fb3f91f">​</span><br></p>
  <pre lang="java"><code>
public class Order {
  private int id;
  private String orderNumber;
  private List&lt;Item&gt; items; // 关联的商品项列表

  // 省略构造函数和getter/setter方法
}

public class Item {
  private int id;
  private int orderId;
  private String itemName;
  private BigDecimal price;

  // 省略构造函数和getter/setter方法
}
</code></pre>
  <p data-lake-id="u7a51f9da" id="u7a51f9da"><br></p>
  <p data-lake-id="u9fea40af" id="u9fea40af"><span data-lake-id="ucd3209cb" id="ucd3209cb">当我们从数据库中查询Order的时候，如果同时把关联的Item都返回，这就不是延迟加载，如果在后面真正要用到Item的时候再查询加载，这就是延迟加载。</span></p>
  <p data-lake-id="u24a4f12b" id="u24a4f12b"><span data-lake-id="u417be5c2" id="u417be5c2">​</span><br></p>
  <p data-lake-id="u7ef6e6c6" id="u7ef6e6c6"><span data-lake-id="u5aee6b99" id="u5aee6b99">延迟加载的主要原理就是当开启了延迟加载功能时，当查询主对象时，MyBatis会生成一个</span><strong><span data-lake-id="u65ef93d1" id="u65ef93d1">代理对</span></strong><span data-lake-id="u38570346" id="u38570346">象，并将代理对象返回给调用者。</span></p>
  <p data-lake-id="u0da9a102" id="u0da9a102"><span data-lake-id="u4f265b71" id="u4f265b71">​</span><br></p>
  <p data-lake-id="u983e5d4f" id="u983e5d4f"><span data-lake-id="u876becca" id="u876becca">当后面需要访问这些关联对象时，代理对象会检查关联对象是否已加载。如果未加载，则触发额外的查询。</span></p>
  <p data-lake-id="u298e67f5" id="u298e67f5"><br></p>
  <p data-lake-id="uf600728a" id="uf600728a"><span data-lake-id="uada75d7c" id="uada75d7c">查询结果返回后，MyBatis会将关联对象的数据填充到代理对象中，使代理对象持有关联对象的引用。这样，下次访问关联对象时，就可以直接从代理对象中获取数据，而无需再次查询数据库。</span></p>
  <p data-lake-id="u00daeca1" id="u00daeca1"><span data-lake-id="u1f36c793" id="u1f36c793">​</span><br></p>
 </body>
</html>